package dao;

import classes.Usuario;
import conexao.GerenciadorConexao;
import erro.ConexaoException;
import erro.ConsultaException;
import erro.DaoException;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

public class DaoUsuario implements IDaoUsuario {

    private GerenciadorConexao g;

    public DaoUsuario() {
        g = GerenciadorConexao.getInstancia();
    }

    /**
     * Insere dados do Usuario no BD.
     * @param usu
     * @throws DaoException
     * @throws ConexaoException 
     */
    @Override
    public void inserir(Usuario usu) throws DaoException, ConexaoException {
        String sql = "INSERT INTO Usuario (cpfusuario,nomeusuario,foneusuario,loginusuario,"
                + "senhausuario,codperfil) VALUES (?,?,?,?,?,?)";
        try {
            PreparedStatement pstm = g.connect().prepareStatement(sql);
            pstm.setString(1, usu.getCpfUsuario());
            pstm.setString(2, usu.getNomeUsuario());
            pstm.setString(3, usu.getFoneUsuario());
            pstm.setString(4, usu.getLoginUsuario());
            pstm.setString(5, usu.getSenhaUsuario());
            pstm.setInt(6, usu.getCodPerfil());
            pstm.executeUpdate();

        } catch (SQLException ex) {
            throw new DaoException();
        } finally {
            g.disconnect();
        }
    }

    /**
     * Altera dados do usuario no BD.
     * @param usu
     * @throws ConexaoException
     * @throws DaoException 
     */
    @Override
    public void alterar(Usuario usu) throws ConexaoException, DaoException {

        String sql = "UPDATE Usuario SET cpfusuario=?,nomeusuario=?,foneusuario=?,loginusuario=?,"
                + "senhausuario=?,codperfil=? WHERE codusuario=?";
        try {
            PreparedStatement pstm = (PreparedStatement) g.connect().prepareStatement(sql);

            pstm.setString(1, usu.getCpfUsuario());
            pstm.setString(2, usu.getNomeUsuario());
            pstm.setString(3, usu.getFoneUsuario());
            pstm.setString(4, usu.getLoginUsuario());
            pstm.setString(5, usu.getSenhaUsuario());
            pstm.setInt(6, usu.getCodPerfil());

            pstm.setInt(7, usu.getCodUsuario());
            pstm.executeUpdate();
        } catch (SQLException ex) {
            throw new DaoException();
        } finally {
            g.disconnect();
        }
    }

    /**
     * Deleta Usuario do BD.
     * @param usu
     * @throws ConexaoException
     * @throws DaoException 
     */
    @Override
    public void deletar(Usuario usu) throws ConexaoException, DaoException {

        String sql = "DELETE FROM Usuario where codusuario=?";
        try {
            PreparedStatement pstm = (PreparedStatement) g.connect().prepareStatement(sql);
            pstm.setInt(1, usu.getCodUsuario());
            pstm.executeUpdate();

        } catch (SQLException ex) {
            throw new DaoException();
        } finally {
            g.disconnect();
        }
    }

    /**
     * Pesquisa usuario no BD.
     * @param loginusuario
     * @return
     * @throws ConexaoException
     * @throws DaoException 
     */
    @Override
    public Usuario pesquisar(Usuario usu) throws ConexaoException, DaoException {
        String sql = "SELECT usu.codusuario,usu.cpfusuario,usu.nomeusuario,usu.foneusuario,"
                + "usu.loginusuario,usu.senhausuario,usu.codperfil,pf.nomeperfil FROM Usuario as usu,Perfil as pf where cpfusuario=?"
                + " and usu.codperfil=pf.codperfil";
        try {
            PreparedStatement pstm = g.connect().prepareStatement(sql);
            pstm.setString(1, usu.getCpfUsuario());
            ResultSet rs = pstm.executeQuery();
            if (rs.next()) {
                usu.setCodUsuario(rs.getInt("codusuario"));
                usu.setCpfUsuario(rs.getString("cpfusuario"));
                usu.setNomeUsuario(rs.getString("nomeusuario"));
                usu.setFoneUsuario(rs.getString("foneusuario"));
                usu.setLoginUsuario(rs.getString("loginusuario"));
                usu.setSenhaUsuario(rs.getString("senhausuario"));
                usu.setCodPerfil(rs.getInt("codperfil"));
                usu.setNomePerfil(rs.getString("nomeperfil"));
            }
        } catch (SQLException ex) {
            throw new DaoException();
        } finally {
            g.disconnect();
        }
        return usu;
    }

    @Override
    public Usuario pesquisarLogin(Usuario usu) throws ConexaoException, DaoException {
        String sql = "SELECT cpfusuario,nomeusuario,foneusuario,loginusuario,senhausuario,"
                + "codperfil FROM usuario where loginusuario = ?";
        try {
            PreparedStatement pstm = g.connect().prepareStatement(sql);
            pstm.setString(1, usu.getLoginUsuario());
            ResultSet rs = pstm.executeQuery();
            if (rs.next()) {
                usu.setCpfUsuario(rs.getString("cpfusuario"));
                usu.setNomeUsuario(rs.getString("nomeusuario"));
                usu.setFoneUsuario(rs.getString("foneusuario"));
                usu.setLoginUsuario(rs.getString("loginusuario"));
                usu.setSenhaUsuario(rs.getString("senhausuario"));
                usu.setCodPerfil(rs.getInt("codperfil"));
            }
        } catch (SQLException ex) {
            throw new DaoException(ex);
        } finally {
            g.disconnect();
        }
        return usu;
    }

    @Override
    public List<Usuario> pesquisarUsu(Usuario usu) throws ConexaoException, ConsultaException {
        List<Usuario> lista = new ArrayList<Usuario>();
         String sql = "SELECT usu.codusuario,usu.cpfusuario,usu.nomeusuario,usu.foneusuario,"
                + "usu.loginusuario,usu.senhausuario,usu.codperfil,pf.nomeperfil FROM Usuario as usu,Perfil as pf where cpfusuario like ?"
                + " and usu.codperfil=pf.codperfil";
        try {
            PreparedStatement pstm = g.connect().prepareStatement(sql);
            pstm.setString(1, usu.getCpfUsuario());
            ResultSet rs = pstm.executeQuery();
            while (rs.next()) {
                usu = new Usuario();
                usu.setCodUsuario(rs.getInt("codusuario"));
                usu.setCpfUsuario(rs.getString("cpfusuario"));
                usu.setNomeUsuario(rs.getString("nomeusuario"));
                usu.setFoneUsuario(rs.getString("foneusuario"));
                usu.setLoginUsuario(rs.getString("loginusuario"));
                usu.setSenhaUsuario(rs.getString("senhausuario"));
                usu.setCodPerfil(rs.getInt("codperfil"));
                usu.setNomePerfil(rs.getString("nomeperfil"));
                lista.add(usu);
            }
        } catch (SQLException ex) {
            throw new ConsultaException();
        } finally {
            g.disconnect();
        }
        return lista;
    }
    
    
    @Override
    public List<Usuario> listar() throws ConexaoException, ConsultaException {
        List<Usuario> lista = new ArrayList<Usuario>();
        Usuario usu;
        String sql = "select *from usuario as usu, perfil as pf "
                + "where usu.codperfil=pf.codperfil order by nomeusuario";
        try {
            Statement stm = (Statement) g.connect().createStatement();
            ResultSet rs = stm.executeQuery(sql);
            while (rs.next()) {
                usu = new Usuario();
                usu.setCodUsuario(rs.getInt("codusuario"));
                usu.setCpfUsuario(rs.getString("cpfusuario"));
                usu.setNomeUsuario(rs.getString("nomeusuario"));
                usu.setFoneUsuario(rs.getString("foneusuario"));
                usu.setLoginUsuario(rs.getString("loginusuario"));
                usu.setNomePerfil(rs.getString("nomeperfil"));
                lista.add(usu);
            }
        } catch (SQLException ex) {
            throw new ConsultaException();
        } finally {
            g.disconnect();
        }
        return lista;
    }
}
